КрНолики.отд
Главная     ◄Глагол   ◄Азбука   ◄Задачи на Глаголе   Примеры приложений ►   Среда разработки ►   Отладка программ ►   Отличия от Оберона ►   Отличия от Паскаля ►   Ассемблер ARM ►   Глагол для ARM ►   ? и Ответы
 
 glagol.png Программируем по-русски
 

Основная задача Глагола — дать человеку возможность воплощать свои мысли на языке, близком к его родному языку.

Издатель Глагола
 

 

(******************************************************************************)
(**)                        ОТДЕЛ КрНолики+;
(******************************************************************************)
(* НАЗНАЧЕНИЕ: пример игры "Крестики-нолики".                                 *)
(* ПРИМЕЧАНИЯ: для управления можно использовать только мышку,                *)
(*        правила игры см. в отделе \Глагол\Приложения\Игры\КрНолики\Игра.отд *)
(******************************************************************************)
ИСПОЛЬЗУЕТ 
  Игра     ИЗ ".\КрНолики\",   (* алгоритм игры *)
  Ввод     ИЗ "...\Отделы\Обмен\",
  Вывод    ИЗ "...\Отделы\Обмен\",
  Окно     ИЗ "...\Отделы\Обмен\",
  Поле     ИЗ "...\Отделы\Поле\",
  Надел    ИЗ "...\Отделы\Поле\",
  Подложка ИЗ "...\Отделы\Поле\",
  Записка  ИЗ "...\Отделы\Поле\",
  Кнопка   ИЗ "...\Отделы\Поле\";

ПОСТ        (* действия *)
  дЗаново=1;
  дВыход =2;

ПЕР
  записка:Записка.Доступ; (* сообщение от машины *)

(******************************************************************************)
ЗАДАЧА РисоватьПозицию;
(* Цель:  прорисовка на экране всей позиции игры
 * До:    <Игра.позиция> - позиция со значками ('+' и 'о')
 * Прим:  каждая клетка занимает два знакоместа в ширину *)
ПЕР
  x,y:ЦЕЛ;         (* координаты клетки в позиции *)
  к,с:ЦЕЛ;         (* экранные координаты клетки *)
  зн:ЗНАК;         (* значок *)
  рисунок:ЦЕПЬ[3]; (* знаки, изображающие значок *)
УКАЗ
  Окно.Цвет(1,1,3,3*2,0FX);
  ОТ y:=0 ДО 2 ВЫП
    ОТ x:=0 ДО 2 ВЫП
      зн:=Игра.позиция[y*3+x];
      ЕСЛИ  зн = " " ТО рисунок:="  "
      АЕСЛИ зн = "+" ТО рисунок:="><"
      АЕСЛИ зн = "о" ТО рисунок:="()"
      КОН;
      к:=1+x*2;
      с:=1+y*1;
      Окно.Цепь(с,к,с,к+1,рисунок)
    КОН
  КОН
КОН РисоватьПозицию;

(******************************************************************************)
ЗАДАЧА НачатьЗаново;
(* Цель:  подготовиться к новой игре *)
УКАЗ
  Игра.НачатьЗаново;
  Записка.Изменить(записка,"");
  РисоватьПозицию
КОН НачатьЗаново;

(******************************************************************************)
ЗАДАЧА МышкаВКлетку(x,y:ЦЕЛ);
(* Цель:  сообразить, что делать, если человек загнал мышку в эту клетку
 * До: ,y> - координаты клетки *)
ПЕР
  n:ЦЕЛ; (* номер клетки в позиции *)
УКАЗ
  ЕСЛИ (x < 0) ИЛИ (x > 2) ИЛИ (y < 0) ИЛИ (y > 2) ТО
    Записка.Изменить(записка,"мимо");
    ВОЗВРАТ
  КОН;
  ЕСЛИ Игра.Окончена() ТО
    ВОЗВРАТ
  КОН;
  n:=y*3+x;
  ЕСЛИ Игра.позиция[n] # " " ТО
    Записка.Изменить(записка,"занято");
    ВОЗВРАТ
  КОН;
  Игра.Ход(n);
  ЕСЛИ Игра.Окончена() ТО
    Записка.Изменить(записка,"Конец!")
  ИНАЧЕ
    Записка.Изменить(записка,"");
  КОН;
  РисоватьПозицию 
КОН МышкаВКлетку;

(******************************************************************************)
ЗАДАЧА Приём(поле:Поле.Доступ; посылка+:Ввод.Посылка);
(* получить и обработать управляющие послания *)
УКАЗ
  ДЛЯ посылка ВИДА
  | Ввод.ОтКлавиш:
      ЕСЛИ посылка.упрАльт И (посылка.код = 58H) (* Alt+'X' *)
         ИЛИ
          (посылка.код = 1BH)                    (* Esc     *)
      ТО
        поле.состояние:=дВыход;
        посылка.код:=0
      КОН
  | Ввод.ОтМышки:
      ЕСЛИ (посылка.события = {}) И (посылка.кнопки # {})
      ТО
        (* нажали кнопку мышки *)
        МышкаВКлетку((посылка.к-1) ДЕЛИТЬ 2,посылка.с-1)
      КОН
  | Кнопка.Посылка:
      ВЫБРАТЬ посылка.кнопка.действие ИЗ
        дЗаново: НачатьЗаново
      | дВыход:  поле.состояние:=дВыход
      КОН
  ИНАЧЕ
  КОН
КОН Приём;

(******************************************************************************)
ЗАДАЧА СоздатьПоле():Поле.Доступ;
(* создает рабочее поле экрана *)
ПЕР
  кнВыход,кнЗаново:Кнопка.Доступ; (* экранные кнопки       *)
  поле:Поле.Доступ;               (* рабочее поле экрана   *)
  подложка:Подложка.Доступ;       (* подложка поля         *)
УКАЗ
  (* создаём поле *)
  поле:=Поле.Создать(0,0,5,19,ПУСТО,ОТКЛ,Приём);
  (* создаём наделы *)
  подложка:=Подложка.Создать(0,0,0,0,"");
  записка:=Записка.Создать(1,8,1,10,""); 
  кнЗаново:=Кнопка.Создать(2,8,"[ ~Заново ]",дЗаново,ВКЛ); 
  кнВыход :=Кнопка.Создать(3,8,"[ ~Выход  ]",дВыход,ВКЛ); 
  (* добавляем наделы в порядке отрисовки и получения ввода *)
  Поле.ДобавитьНадел(поле,подложка);
  Поле.ДобавитьНадел(поле,записка);
  Поле.ДобавитьНадел(поле,кнЗаново);
  Поле.ДобавитьНадел(поле,кнВыход);
  ВОЗВРАТ поле
КОН СоздатьПоле;

(******************************************************************************)
ЗАДАЧА Поехали;
ПЕР
  поле:Поле.Доступ;
УКАЗ
  Окно.Графическое("Крестики-нолики","Lucida Console",24,ПУСТО);
(*
  Окно.Текстовое(ПУСТО);
 *)
  поле:=СоздатьПоле();
  Поле.ОкноНаВсёПоле(поле);
  Поле.Рисовать(поле);
  Окно.Показать;
  НачатьЗаново;
  ПОВТОРЯТЬ
    Поле.Проверить(поле)
  ДО поле.состояние # Поле.сРабота
КОН Поехали;

(******************************************************************************)
УКАЗ
  Поехали
КОН КрНолики.




Вопросы, замечания и предложения высылайте на atimopheyev@yahoo.com или Издателю Глагола:
 email
 
Главная     ◄Глагол   ◄Азбука   ◄Задачи на Глаголе   Примеры приложений ►   Среда разработки ►   Отладка программ ►   Отличия от Оберона ►   Отличия от Паскаля ►   Ассемблер ARM ►   Глагол для ARM ►   ? и Ответы